home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / hplip / prnt / cups.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  22KB  |  704 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import os.path as os
  6. import gzip
  7. import re
  8. import time
  9. import urllib
  10. import tempfile
  11. import glob
  12. from base.g import *
  13. from base import utils, models
  14. INVALID_PRINTER_NAME_CHARS = '~`!@#$%^&*()=+[]{}()\\/,.<>?\'";:| '
  15.  
  16. try:
  17.     current_language = os.getenv('LANG')
  18.     newlang = 'C'
  19.     if current_language is not None and current_language.count('.'):
  20.         (newlang, encoding) = current_language.split('.')
  21.         newlang += '.UTF-8'
  22.     
  23.     os.environ['LANG'] = newlang
  24.     current_ctype = os.getenv('LC_CTYPE')
  25.     newctype = 'C'
  26.     if current_ctype is not None and current_ctype.count('.'):
  27.         (newctype, encoding) = current_ctype.split('.')
  28.         newctype += '.UTF-8'
  29.     
  30.     os.environ['LC_CTYPE'] = newctype
  31.     import cupsext
  32.     if current_ctype is not None:
  33.         os.environ['LC_CTYPE'] = current_ctype
  34.     
  35.     if current_language is not None:
  36.         os.environ['LANG'] = current_language
  37. except ImportError:
  38.     if not os.getenv('HPLIP_BUILD'):
  39.         log.warn('CUPSEXT could not be loaded. Please check HPLIP installation.')
  40.         sys.exit(1)
  41.     
  42. except:
  43.     os.getenv('HPLIP_BUILD')
  44.  
  45. IPP_PRINTER_STATE_IDLE = 3
  46. IPP_PRINTER_STATE_PROCESSING = 4
  47. IPP_PRINTER_STATE_STOPPED = 5
  48. PPD_UI_BOOLEAN = 0
  49. PPD_UI_PICKONE = 1
  50. PPD_UI_PICKMANY = 2
  51. UI_SPINNER = 100
  52. UI_UNITS_SPINNER = 101
  53. UI_BANNER_JOB_SHEETS = 102
  54. UI_PAGE_RANGE = 103
  55. UI_JOB_STORAGE_MODE = 104
  56. UI_JOB_STORAGE_PIN = 105
  57. UI_JOB_STORAGE_USERNAME = 106
  58. UI_JOB_STORAGE_ID = 107
  59. UI_JOB_STORAGE_ID_EXISTS = 108
  60. IPP_PAUSE_PRINTER = 16
  61. IPP_RESUME_PRINTER = 17
  62. IPP_PURGE_JOBS = 18
  63. CUPS_GET_DEFAULT = 16385
  64. CUPS_GET_PRINTERS = 16386
  65. CUPS_ADD_MODIFY_PRINTER = 16387
  66. CUPS_DELETE_PRINTER = 16388
  67. CUPS_GET_CLASSES = 16389
  68. CUPS_ADD_MODIFY_CLASS = 16390
  69. CUPS_DELETE_CLASS = 16391
  70. CUPS_ACCEPT_JOBS = 16392
  71. CUPS_REJECT_JOBS = 16393
  72. CUPS_SET_DEFAULT = 16394
  73. CUPS_GET_DEVICES = 16395
  74. CUPS_GET_PPDS = 16396
  75. CUPS_MOVE_JOB = 16397
  76. CUPS_AUTHENTICATE_JOB = 16398
  77. IPP_JOB_PENDING = 3
  78. IPP_JOB_HELD = 4
  79. IPP_JOB_PROCESSING = 5
  80. IPP_JOB_STOPPED = 6
  81. IPP_JOB_CANCELLED = 7
  82. IPP_JOB_ABORTED = 8
  83. IPP_JOB_COMPLETED = 8
  84. IPP_OK = 0
  85. IPP_OK_SUBST = 1
  86. IPP_OK_CONFLICT = 2
  87. IPP_OK_IGNORED_SUBSCRIPTIONS = 3
  88. IPP_OK_IGNORED_NOTIFICATIONS = 4
  89. IPP_OK_TOO_MANY_EVENTS = 5
  90. IPP_OK_BUT_CANCEL_SUBSCRIPTION = 6
  91. IPP_OK_EVENTS_COMPLETE = 7
  92. IPP_REDIRECTION_OTHER_SITE = 768
  93. IPP_BAD_REQUEST = 1024
  94. IPP_FORBIDDEN = 1025
  95. IPP_NOT_AUTHENTICATED = 1026
  96. IPP_NOT_AUTHORIZED = 1027
  97. IPP_NOT_POSSIBLE = 1028
  98. IPP_TIMEOUT = 1029
  99. IPP_NOT_FOUND = 1030
  100. IPP_GONE = 1031
  101. IPP_REQUEST_ENTITY = 1032
  102. IPP_REQUEST_VALUE = 1033
  103. IPP_DOCUMENT_FORMAT = 1034
  104. IPP_ATTRIBUTES = 1035
  105. IPP_URI_SCHEME = 1036
  106. IPP_CHARSET = 1037
  107. IPP_CONFLICT = 1038
  108. IPP_COMPRESSION_NOT_SUPPORTED = 1039
  109. IPP_COMPRESSION_ERROR = 1040
  110. IPP_DOCUMENT_FORMAT_ERROR = 1041
  111. IPP_DOCUMENT_ACCESS_ERROR = 1042
  112. IPP_ATTRIBUTES_NOT_SETTABLE = 1043
  113. IPP_IGNORED_ALL_SUBSCRIPTIONS = 1044
  114. IPP_TOO_MANY_SUBSCRIPTIONS = 1045
  115. IPP_IGNORED_ALL_NOTIFICATIONS = 1046
  116. IPP_PRINT_SUPPORT_FILE_NOT_FOUND = 1047
  117. IPP_INTERNAL_ERROR = 1280
  118. IPP_OPERATION_NOT_SUPPORTED = 1281
  119. IPP_SERVICE_UNAVAILABLE = 1282
  120. IPP_VERSION_NOT_SUPPORTED = 1283
  121. IPP_DEVICE_ERROR = 1284
  122. IPP_TEMPORARY_ERROR = 1285
  123. IPP_NOT_ACCEPTING = 1286
  124. IPP_PRINTER_BUSY = 1287
  125. IPP_ERROR_JOB_CANCELLED = 1288
  126. IPP_MULTIPLE_JOBS_NOT_SUPPORTED = 1289
  127. IPP_PRINTER_IS_DEACTIVATED = 1290
  128. CUPS_ERROR_BAD_NAME = 3840
  129. CUPS_ERROR_BAD_PARAMETERS = 3841
  130. nickname_pat = re.compile('\\*NickName:\\s*\\"(.*)"', re.MULTILINE)
  131. pat_cups_error_log = re.compile('^loglevel\\s?(debug|debug2|warn|info|error|none)', re.I)
  132. ppd_pat = re.compile('.*hp-(.*?)(-.*)*\\.ppd.*', re.I)
  133.  
  134. def getPPDPath(addtional_paths = None):
  135.     '''
  136.         Returns the CUPS ppd path (not the foomatic one under /usr/share/ppd).
  137.         Usually this is /usr/share/cups/model.
  138.     '''
  139.     if addtional_paths is None:
  140.         addtional_paths = []
  141.     
  142.     search_paths = prop.ppd_search_path.split(';') + addtional_paths
  143.     for path in search_paths:
  144.         ppd_path = os.path.join(path, 'cups/model')
  145.         if os.path.exists(ppd_path):
  146.             return ppd_path
  147.     
  148.  
  149.  
  150. def getAllowableMIMETypes():
  151.     '''
  152.         Scan all /etc/cups/*.convs files for allowable file formats.
  153.     '''
  154.     files = glob.glob('/etc/cups/*.convs')
  155.     allowable_mime_types = []
  156.     for f in files:
  157.         conv_file = file(f, 'r')
  158.         for line in conv_file:
  159.             if not line.startswith('#') and len(line) > 1:
  160.                 
  161.                 try:
  162.                     (source, dest, cost, prog) = line.split()
  163.                 except ValueError:
  164.                     continue
  165.  
  166.                 if source not in ('application/octet-stream', 'application/vnd.cups-postscript'):
  167.                     allowable_mime_types.append(source)
  168.                 
  169.             source not in ('application/octet-stream', 'application/vnd.cups-postscript')
  170.         
  171.     
  172.     allowable_mime_types.append('image/x-bmp')
  173.     allowable_mime_types.append('text/cpp')
  174.     allowable_mime_types.append('application/x-python')
  175.     allowable_mime_types.append('application/hplip-fax')
  176.     return allowable_mime_types
  177.  
  178.  
  179. def getPPDDescription(f):
  180.     if f.endswith('.gz'):
  181.         nickname = gzip.GzipFile(f, 'r').read(4096)
  182.     else:
  183.         nickname = file(f, 'r').read(4096)
  184.     
  185.     try:
  186.         desc = nickname_pat.search(nickname).group(1)
  187.     except AttributeError:
  188.         desc = ''
  189.  
  190.     return desc
  191.  
  192.  
  193. def getSystemPPDs():
  194.     (major, minor, patch) = getVersionTuple()
  195.     ppds = { }
  196.     if major == 1 and minor < 2:
  197.         ppd_dir = sys_conf.get('dirs', 'ppd')
  198.         log.debug('(CUPS 1.1.x) Searching for PPDs in: %s' % ppd_dir)
  199.         for f in utils.walkFiles(ppd_dir, pattern = 'HP*ppd*;hp*ppd*', abs_paths = True):
  200.             desc = getPPDDescription(f)
  201.             if not 'foo2' in desc and 'gutenprint' in desc.lower() or 'gutenprint' in f:
  202.                 ppds[f] = desc
  203.                 log.debug('%s: %s' % (f, desc))
  204.                 continue
  205.         
  206.     else:
  207.         log.debug('(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...')
  208.         ppd_dict = cupsext.getPPDList()
  209.         cups_ppd_path = getPPDPath()
  210.         foomatic_ppd_path = sys_conf.get('dirs', 'ppdbase', '/usr/share/ppd')
  211.         if not foomatic_ppd_path or not os.path.exists(foomatic_ppd_path):
  212.             foomatic_ppd_path = '/usr/share/ppd'
  213.         
  214.         log.debug('CUPS PPD base path = %s' % cups_ppd_path)
  215.         log.debug('Foomatic PPD base path = %s' % foomatic_ppd_path)
  216.         for ppd in ppd_dict:
  217.             if not ppd:
  218.                 continue
  219.             
  220.             if ('hp-' in ppd.lower() or 'hp_' in ppd.lower()) and ppd_dict[ppd]['ppd-make'] == 'HP':
  221.                 desc = ppd_dict[ppd]['ppd-make-and-model']
  222.                 if not 'foo2' in desc.lower() and 'gutenprint' in desc.lower() or 'gutenprint' in ppd:
  223.                     if os.path.exists(ppd):
  224.                         path = ppd
  225.                     else:
  226.                         
  227.                         try:
  228.                             path = os.path.join(foomatic_ppd_path, ppd)
  229.                         except AttributeError:
  230.                             path = ppd
  231.  
  232.                         if not os.path.exists(path):
  233.                             
  234.                             try:
  235.                                 path = os.path.join(cups_ppd_path, ppd)
  236.                             except AttributeError:
  237.                                 path = ppd
  238.  
  239.                             if not os.path.exists(path):
  240.                                 path = ppd
  241.                             
  242.                         
  243.                     ppds[path] = desc
  244.                 
  245.             'gutenprint' in ppd
  246.         
  247.     return ppds
  248.  
  249.  
  250. def levenshtein_distance(a, b):
  251.     '''
  252.     Calculates the Levenshtein distance between a and b.
  253.     Written by Magnus Lie Hetland.
  254.     '''
  255.     n = len(a)
  256.     m = len(b)
  257.     if n > m:
  258.         a = b
  259.         b = a
  260.         n = m
  261.         m = n
  262.     
  263.     current = range(n + 1)
  264.     for i in range(1, m + 1):
  265.         previous = current
  266.         current = [
  267.             i] + [
  268.             0] * m
  269.         for j in range(1, n + 1):
  270.             add = previous[j] + 1
  271.             delete = current[j - 1] + 1
  272.             change = previous[j - 1]
  273.             if a[j - 1] != b[i - 1]:
  274.                 change = change + 1
  275.             
  276.             current[j] = min(add, delete, change)
  277.         
  278.     
  279.     return current[n]
  280.  
  281. number_pat = re.compile('.*?(\\d+)', re.IGNORECASE)
  282. STRIP_STRINGS2 = [
  283.     'foomatic:',
  284.     'hp-',
  285.     'hp_',
  286.     'hp ',
  287.     '.gz',
  288.     '.ppd',
  289.     'drv:',
  290.     '-pcl',
  291.     '-pcl3',
  292.     '-jetready',
  293.     '-zxs',
  294.     '-zjs',
  295.     '-ps',
  296.     '-postscript',
  297.     '-jr',
  298.     '-lidl',
  299.     '-lidil',
  300.     '-ldl',
  301.     '-hpijs']
  302. for p in models.TECH_CLASS_PDLS.values():
  303.     pp = '-%s' % p
  304.     if pp not in STRIP_STRINGS2:
  305.         STRIP_STRINGS2.append(pp)
  306.         continue
  307.  
  308. STRIP_STRINGS = STRIP_STRINGS2[:]
  309. STRIP_STRINGS.extend([
  310.     '-series',
  311.     ' series',
  312.     '_series'])
  313.  
  314. def stripModel2(model):
  315.     model = model.lower()
  316.     for x in STRIP_STRINGS2:
  317.         model = model.replace(x, '')
  318.     
  319.     return model
  320.  
  321.  
  322. def stripModel(model):
  323.     model = model.lower()
  324.     for x in STRIP_STRINGS:
  325.         model = model.replace(x, '')
  326.     
  327.     return model
  328.  
  329.  
  330. def getPPDFile(stripped_model, ppds):
  331.     '''
  332.         Match up a model name to a PPD from a list of system PPD files.
  333.     '''
  334.     log.debug('1st stage edit distance match')
  335.     mins = { }
  336.     eds = { }
  337.     min_edit_distance = sys.maxint
  338.     log.debug('Determining edit distance from %s (only showing edit distances < 4)...' % stripped_model)
  339.     for f in ppds:
  340.         t = stripModel(os.path.basename(f))
  341.         eds[f] = levenshtein_distance(stripped_model, t)
  342.         if eds[f] < 4:
  343.             log.debug("dist('%s') = %d" % (t, eds[f]))
  344.         
  345.         min_edit_distance = min(min_edit_distance, eds[f])
  346.     
  347.     log.debug('Min. dist = %d' % min_edit_distance)
  348.     for f in ppds:
  349.         if eds[f] == min_edit_distance:
  350.             for m in mins:
  351.                 if os.path.basename(m) == os.path.basename(f):
  352.                     break
  353.                     continue
  354.             else:
  355.                 mins[f] = ppds[f]
  356.     
  357.     log.debug(mins)
  358.     if len(mins) > 1:
  359.         log.debug('2nd stage matching with model number')
  360.         
  361.         try:
  362.             model_number = number_pat.match(stripped_model).group(1)
  363.             model_number = int(model_number)
  364.         except AttributeError:
  365.             pass
  366.         except ValueError:
  367.             pass
  368.  
  369.         log.debug('model_number=%d' % model_number)
  370.         matches = { }
  371.         for x in range(3):
  372.             factor = 10 ** x
  373.             log.debug('Factor = %d' % factor)
  374.             adj_model_number = int(model_number / factor) * factor
  375.             (number_matching, match) = (0, '')
  376.             for m in mins:
  377.                 
  378.                 try:
  379.                     mins_model_number = number_pat.match(os.path.basename(m)).group(1)
  380.                     mins_model_number = int(mins_model_number)
  381.                     log.debug('mins_model_number= %d' % mins_model_number)
  382.                 except AttributeError:
  383.                     continue
  384.                 except ValueError:
  385.                     continue
  386.  
  387.                 mins_adj_model_number = int(mins_model_number / factor) * factor
  388.                 log.debug('mins_adj_model_number=%d' % mins_adj_model_number)
  389.                 log.debug('adj_model_number=%d' % adj_model_number)
  390.                 if mins_adj_model_number == adj_model_number:
  391.                     log.debug('match')
  392.                     number_matching += 1
  393.                     matches[m] = ppds[m]
  394.                     log.debug(matches)
  395.                 
  396.                 log.debug('***')
  397.             
  398.             if len(matches):
  399.                 mins = matches
  400.                 break
  401.                 continue
  402.         
  403.     
  404.     return mins
  405.  
  406.  
  407. def getPPDFile2(stripped_model, ppds):
  408.     log.debug('Matching PPD list to model %s...' % stripped_model)
  409.     matches = []
  410.     for f in ppds:
  411.         match = ppd_pat.match(f)
  412.         if match is not None:
  413.             if match.group(1) == stripped_model:
  414.                 log.debug('Found match: %s' % f)
  415.                 
  416.                 try:
  417.                     pdls = match.group(2).split('-')
  418.                 except AttributeError:
  419.                     pdls = []
  420.  
  421.             None if not prop.hpcups_build or 'hpijs' not in f else 'hpijs' not in pdls
  422.             continue
  423.     
  424.     log.debug(matches)
  425.     num_matches = len(matches)
  426.     if num_matches == 0:
  427.         log.error('No PPD found for model %s using new algorithm. Trying old algorithm...' % stripped_model)
  428.         matches2 = getPPDFile(stripModel(stripped_model), ppds).items()
  429.         log.debug(matches2)
  430.         num_matches2 = len(matches2)
  431.         if num_matches2:
  432.             for f, d in matches2:
  433.                 match = ppd_pat.match(f)
  434.                 if match is not None:
  435.                     log.debug('Found match: %s' % f)
  436.                     
  437.                     try:
  438.                         pdls = match.group(2).split('-')
  439.                     except AttributeError:
  440.                         pdls = []
  441.  
  442.                     if prop.hpcups_build or 'hpijs' not in f:
  443.                         pass
  444.                     None if (prop.hpijs_build or 'hpijs' in pdls or prop.hpcups_build) and 'hpijs' not in pdls else 'hpijs' not in pdls
  445.                     continue
  446.             
  447.         
  448.         log.debug(matches)
  449.         num_matches = len(matches)
  450.     
  451.     if num_matches == 0:
  452.         log.error('No PPD found for model %s using old algorithm.' % stripModel(stripped_model))
  453.         return None
  454.     if num_matches == 1:
  455.         log.debug('One match found.')
  456.         return (matches[0][0], '')
  457.     log.debug('%d matches found. Selecting based on PDL: Host > PS > PCL/Other' % num_matches)
  458.     for p in [
  459.         models.PDL_TYPE_HOST,
  460.         models.PDL_TYPE_PS,
  461.         models.PDL_TYPE_PCL]:
  462.         for f, pdl_list in matches:
  463.             for x in pdl_list:
  464.                 if models.PDL_TYPES.get(x, models.PDL_TYPE_HOST) == p:
  465.                     log.debug("Selecting '-%s' PPD: %s" % (x, f))
  466.                     return (f, '')
  467.             
  468.         
  469.     
  470.     log.debug('No specific PDL located. Defaulting to first found PPD file.')
  471.     return (matches[0][0], '')
  472.  
  473.  
  474. def getErrorLogLevel():
  475.     cups_conf = '/etc/cups/cupsd.conf'
  476.     
  477.     try:
  478.         f = file(cups_conf, 'r')
  479.     except OSError:
  480.         log.error('%s not found.' % cups_conf)
  481.     except IOError:
  482.         log.error('%s: I/O error.' % cups_conf)
  483.  
  484.     for l in f:
  485.         m = pat_cups_error_log.match(l)
  486.         if m is not None:
  487.             level = m.group(1).lower()
  488.             log.debug('CUPS error_log LogLevel: %s' % level)
  489.             return level
  490.     
  491.     log.debug('CUPS error_log LogLevel: unknown')
  492.     return 'unknown'
  493.  
  494.  
  495. def getPrintJobErrorLog(job_id, max_lines = 1000, cont_interval = 5):
  496.     ret = []
  497.     s = '[Job %d]' % job_id
  498.     cups_conf = '/var/log/cups/error_log'
  499.     
  500.     try:
  501.         f = file(cups_conf, 'r')
  502.     except (IOError, OSError):
  503.         log.error('Could not open the CUPS error_log file: %s' % cups_conf)
  504.         return ''
  505.  
  506.     if s in file(cups_conf, 'r').read():
  507.         queue = utils.Queue()
  508.         job_found = False
  509.         while True:
  510.             line = f.readline()
  511.             if s in line:
  512.                 job_found = True
  513.                 while len(queue):
  514.                     ret.append(queue.get())
  515.                 ret.append(line.strip())
  516.                 if len(ret) > max_lines:
  517.                     break
  518.                 
  519.             len(ret) > max_lines
  520.             if job_found:
  521.                 queue.put(line.strip())
  522.                 if len(queue) > cont_interval:
  523.                     break
  524.                 
  525.             len(queue) > cont_interval
  526.     
  527.     return '\n'.join(ret)
  528.  
  529.  
  530. def getDefaultPrinter():
  531.     r = cupsext.getDefaultPrinter()
  532.     if r is None:
  533.         log.debug('The CUPS default printer is not set.')
  534.     
  535.     return r
  536.  
  537.  
  538. def setDefaultPrinter(printer_name):
  539.     setPasswordPrompt('You do not have permission to set the default printer.')
  540.     return cupsext.setDefaultPrinter(printer_name)
  541.  
  542.  
  543. def accept(printer_name):
  544.     setPasswordPrompt('You do not have permission to accept jobs on a printer queue.')
  545.     return controlPrinter(printer_name, CUPS_ACCEPT_JOBS)
  546.  
  547.  
  548. def reject(printer_name):
  549.     setPasswordPrompt('You do not have permission to reject jobs on a printer queue.')
  550.     return controlPrinter(printer_name, CUPS_REJECT_JOBS)
  551.  
  552.  
  553. def start(printer_name):
  554.     setPasswordPrompt('You do not have permission to start a printer queue.')
  555.     return controlPrinter(printer_name, IPP_RESUME_PRINTER)
  556.  
  557.  
  558. def stop(printer_name):
  559.     setPasswordPrompt('You do not have permission to stop a printer queue.')
  560.     return controlPrinter(printer_name, IPP_PAUSE_PRINTER)
  561.  
  562.  
  563. def purge(printer_name):
  564.     setPasswordPrompt('You do not have permission to purge jobs.')
  565.     return controlPrinter(printer_name, IPP_PURGE_JOBS)
  566.  
  567.  
  568. def controlPrinter(printer_name, cups_op):
  569.     if cups_op in (CUPS_ACCEPT_JOBS, CUPS_REJECT_JOBS, IPP_PAUSE_PRINTER, IPP_RESUME_PRINTER, IPP_PURGE_JOBS):
  570.         return cupsext.controlPrinter(printer_name, cups_op)
  571.     return 0
  572.  
  573.  
  574. def openPPD(printer):
  575.     if not printer:
  576.         return None
  577.     return cupsext.openPPD(printer)
  578.  
  579.  
  580. def closePPD():
  581.     return cupsext.closePPD()
  582.  
  583.  
  584. def getPPD(printer):
  585.     if not printer:
  586.         return None
  587.     return cupsext.getPPD(printer)
  588.  
  589.  
  590. def getPPDOption(option):
  591.     return cupsext.getPPDOption(option)
  592.  
  593.  
  594. def getPPDPageSize():
  595.     return cupsext.getPPDPageSize()
  596.  
  597.  
  598. def getPrinters():
  599.     return cupsext.getPrinters()
  600.  
  601.  
  602. def getJobs(my_job = 0, completed = 0):
  603.     return cupsext.getJobs(my_job, completed)
  604.  
  605.  
  606. def getAllJobs(my_job = 0):
  607.     return cupsext.getJobs(my_job, 0) + cupsext.getJobs(my_job, 1)
  608.  
  609.  
  610. def getVersion():
  611.     return cupsext.getVersion()
  612.  
  613.  
  614. def getVersionTuple():
  615.     return cupsext.getVersionTuple()
  616.  
  617.  
  618. def getServer():
  619.     return cupsext.getServer()
  620.  
  621.  
  622. def cancelJob(jobid, dest = None):
  623.     setPasswordPrompt('You do not have permission to cancel a job.')
  624.     if dest is not None:
  625.         return cupsext.cancelJob(dest, jobid)
  626.     jobs = cupsext.getJobs(0, 0)
  627.     for j in jobs:
  628.         if j.id == jobid:
  629.             return cupsext.cancelJob(j.dest, jobid)
  630.     
  631.     return False
  632.  
  633.  
  634. def resetOptions():
  635.     return cupsext.resetOptions()
  636.  
  637.  
  638. def addOption(option):
  639.     return cupsext.addOption(option)
  640.  
  641.  
  642. def getOptions():
  643.     return cupsext.getOptions()
  644.  
  645.  
  646. def printFile(printer, filename, title):
  647.     if os.path.exists(filename):
  648.         return cupsext.printFileWithOptions(printer, filename, title)
  649.     return -1
  650.  
  651.  
  652. def addPrinter(printer_name, device_uri, location, ppd_file, model, info):
  653.     log.debug("addPrinter('%s', '%s', '%s', '%s', '%s', '%s')" % (printer_name, device_uri, location, ppd_file, model, info))
  654.     if ppd_file and not os.path.exists(ppd_file):
  655.         log.error("PPD file '%s' not found." % ppd_file)
  656.         return (-1, 'PPD file not found')
  657.     return cupsext.addPrinter(printer_name, device_uri, location, ppd_file, model, info)
  658.  
  659.  
  660. def delPrinter(printer_name):
  661.     setPasswordPrompt('You do not have permission to delete a printer.')
  662.     return cupsext.delPrinter(printer_name)
  663.  
  664.  
  665. def getGroupList():
  666.     return cupsext.getGroupList()
  667.  
  668.  
  669. def getGroup(group):
  670.     return cupsext.getGroup(group)
  671.  
  672.  
  673. def getOptionList(group):
  674.     return cupsext.getOptionList(group)
  675.  
  676.  
  677. def getOption(group, option):
  678.     return cupsext.getOption(group, option)
  679.  
  680.  
  681. def getChoiceList(group, option):
  682.     return cupsext.getChoiceList(group, option)
  683.  
  684.  
  685. def getChoice(group, option, choice):
  686.     return cupsext.getChoice(group, option, choice)
  687.  
  688.  
  689. def setOptions():
  690.     return cupsext.setOptions()
  691.  
  692.  
  693. def removeOption(option):
  694.     return cupsext.removeOption(option)
  695.  
  696.  
  697. def setPasswordCallback(func):
  698.     return cupsext.setPasswordCallback(func)
  699.  
  700.  
  701. def setPasswordPrompt(prompt):
  702.     return cupsext.setPasswordPrompt(prompt)
  703.  
  704.